package com.eian.boot.common.core.utils;

import com.eian.boot.common.core.enums.IBaseEnum;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 枚举工具类
 * 提供枚举查询、转换等扩展方法
 * 基础的 getByValue 和 getByLabel 方法已在 {@link IBaseEnum} 接口中提供
 *
 * @author alex.meng
 * @createTime 2025-10-14
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class EnumUtils {

    /**
     * 根据值获取枚举实例
     * 委托给 IBaseEnum 接口方法
     *
     * @param enumClass 枚举类
     * @param value     枚举值
     * @param <E>       枚举类型
     * @param <T>       值类型
     * @return 枚举实例，未找到返回null
     */
    public static <E extends Enum<E> & IBaseEnum<T>, T> E getByValue(Class<E> enumClass, T value) {
        return IBaseEnum.getByValue(enumClass, value);
    }

    /**
     * 根据标签获取枚举实例
     * 委托给 IBaseEnum 接口方法
     *
     * @param enumClass 枚举类
     * @param label     枚举标签
     * @param <E>       枚举类型
     * @param <T>       值类型
     * @return 枚举实例，未找到返回null
     */
    public static <E extends Enum<E> & IBaseEnum<T>, T> E getByLabel(Class<E> enumClass, String label) {
        return IBaseEnum.getByLabel(enumClass, label);
    }

    /**
     * 获取所有枚举值列表
     *
     * @param enumClass 枚举类
     * @param <E>       枚举类型
     * @param <T>       值类型
     * @return 枚举值列表
     */
    public static <E extends Enum<E> & IBaseEnum<T>, T> List<T> getValues(Class<E> enumClass) {
        if (enumClass == null) {
            return List.of();
        }
        return Arrays.stream(enumClass.getEnumConstants())
                .map(IBaseEnum::getValue)
                .collect(Collectors.toList());
    }

    /**
     * 获取所有枚举标签列表
     *
     * @param enumClass 枚举类
     * @param <E>       枚举类型
     * @param <T>       值类型
     * @return 枚举标签列表
     */
    public static <E extends Enum<E> & IBaseEnum<T>, T> List<String> getLabels(Class<E> enumClass) {
        if (enumClass == null) {
            return List.of();
        }
        return Arrays.stream(enumClass.getEnumConstants())
                .map(IBaseEnum::getLabel)
                .collect(Collectors.toList());
    }

    /**
     * 检查值是否为有效的枚举值
     *
     * @param enumClass 枚举类
     * @param value     待检查的值
     * @param <E>       枚举类型
     * @param <T>       值类型
     * @return true-有效，false-无效
     */
    public static <E extends Enum<E> & IBaseEnum<T>, T> boolean isValidValue(Class<E> enumClass, T value) {
        return IBaseEnum.getByValue(enumClass, value) != null;
    }

    /**
     * 检查标签是否为有效的枚举标签
     *
     * @param enumClass 枚举类
     * @param label     待检查的标签
     * @param <E>       枚举类型
     * @param <T>       值类型
     * @return true-有效，false-无效
     */
    public static <E extends Enum<E> & IBaseEnum<T>, T> boolean isValidLabel(Class<E> enumClass, String label) {
        return IBaseEnum.getByLabel(enumClass, label) != null;
    }

    /**
     * 获取枚举的值和标签映射描述
     *
     * @param enumClass 枚举类
     * @param <E>       枚举类型
     * @param <T>       值类型
     * @return 格式化的描述字符串，如："0-否，1-是"
     */
    public static <E extends Enum<E> & IBaseEnum<T>, T> String getValueLabelDesc(Class<E> enumClass) {
        if (enumClass == null) {
            return "";
        }
        return Arrays.stream(enumClass.getEnumConstants())
                .map(e -> e.getValue() + "-" + e.getLabel())
                .collect(Collectors.joining("，"));
    }
}

